package org.sunshine.mamadu.gui;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tray;
import org.eclipse.swt.widgets.TrayItem;
import org.sunshine.mamadu.Advertisement;
import org.sunshine.mamadu.LocalLogger;
import org.sunshine.mamadu.MamaduCheck;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class MainFrame implements MamaduCheck.Listener, Runnable {

    public static final RGB DEFAULT_BACKROUND = new RGB(243, 185, 230);

    public Display display;
    private TrayItem trayItem;


    private TableShell tableShell;

    public MainFrame() {
    }

    public void run() {
        display = new Display();
        initTray();

        tableShell = new TableShell(display);

//        Shell shell = openMainShell(display);
        while (!trayItem.isDisposed()) {
            if (!display.readAndDispatch()) display.sleep();
        }
        display.dispose();
        System.exit(0);
    }

    /**
     * can be removed
     */
    public Shell openMainShell(final Display display) {

        Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());

        shell.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                trayItem.dispose();
                System.exit(0);
            }
        });


        Button button = new Button(shell, SWT.LEFT);
        button.setText("show");
        button.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {


                ArrayList<Advertisement> list = new ArrayList<Advertisement>();
                Advertisement ad1 = new Advertisement();
                ad1.setName("Kolyan");
                ad1.setEmail("Kolyan@mail.com");
                ad1.setDate("20/50/2007");
                ad1.setPhone("234234234");
                ad1.setContent("сдаю без комиссии 1 комн квартиру 7 мин.пишком от метро Варшавская. " +
                        "Вся мебель и бытовая новые стоимость 22500р в месяц +свет телефон и интернет." +
                        "Посредникам строго не звонить.");

                Advertisement ad2 = new Advertisement();
                ad2.setName("Kolyan");
                ad2.setEmail("Kolyan@mail.com");
                ad2.setDate("20/50/2007");
                ad2.setPhone("234234234");
                ad2.setContent("сдаю без комиссии 1 комн квартиру 7 мин.пишком от метро Варшавская. " +
                        "Вся мебель и бытовая новые стоимость 22500р в месяц +свет телефон и интернет." +
                        "Посредникам строго не звонить.");
                list.add(ad1);
                list.add(ad2);


                new FloatingInfoShell(display, ad1);
                new FloatingInfoShell(display, ad2);
            }
        });

        shell.open();

        return shell;
    }


    void initTray() {
        Image image = getIcon();


        final Tray tray = display.getSystemTray();
        trayItem = new TrayItem(tray, SWT.NONE);

        trayItem.setToolTipText("Mamadu Notifier");
        trayItem.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
//                System.out.println("selection");
            }
        });
        trayItem.addListener(SWT.DefaultSelection, new Listener() {
            public void handleEvent(Event event) {
                LocalLogger.LOGGER.fine("opening table shell");
                if (tableShell.isVisible()) {
                    tableShell.hide();
                } else {
                    tableShell.show(advertisements);
                }

            }
        });
        trayItem.setImage(image);
        trayItem.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {

            }
        });

        final Menu menu = new Menu(new Shell(), SWT.POP_UP);
        MenuItem closeItem = new MenuItem(menu, SWT.PUSH);
        closeItem.setText("Close");
        closeItem.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
                if (!trayItem.isDisposed()) {
                    trayItem.dispose();
                }
            }
        });

        trayItem.addListener(SWT.MenuDetect, new Listener() {
            public void handleEvent(Event event) {
                menu.setVisible(true);
            }
        });

        Runtime.getRuntime().addShutdownHook(new Thread("Stray dispose") {
            public void run() {
                display.syncExec(new Runnable() {
                    public void run() {
                        if (!trayItem.isDisposed()) {
                            trayItem.dispose();
                        }
                    }
                });
            }
        });
    }

    private static Image image = null;

    public static Image getIcon() {
        if (image == null) {
            InputStream sourceStream = MainFrame.class.getResourceAsStream("/favicon.ico");
            ImageData source = new ImageData(sourceStream);
            ImageData mask = source.getTransparencyMask();
            image = new Image(null, source, mask);
        }
        return image;
    }

    private List<Advertisement> advertisements = new ArrayList<Advertisement>();
    private List<Advertisement> newAdvertisements = new ArrayList<Advertisement>();

    public void handleNewAds(java.util.List<Advertisement> list) {
        newAdvertisements = list;
        display.asyncExec(new Runnable() {
            public void run() {
                for (Advertisement advertisement : newAdvertisements) {
                    new FloatingInfoShell(display, advertisement);
                }
            }
        });
    }


    public void handleInitAds(List<Advertisement> list) {
        advertisements = list;
    }

    public static void main(String[] args) throws InterruptedException {
        ArrayList<Advertisement> list = new ArrayList<Advertisement>();
        Advertisement ad1 = new Advertisement();
        ad1.setName("Kolyan");
        ad1.setEmail("Kolyan@mail.com");
        ad1.setDate("20/50/2007");
        ad1.setPhone("234234234");
        ad1.setContent("сдаю без комиссии 1 комн квартиру 7 мин.пишком от метро Варшавская. " +
                "Вся мебель и бытовая новые стоимость 22500р в месяц +свет телефон и интернет." +
                "Посредникам строго не звонить.");

        Advertisement ad2 = new Advertisement();
        ad2.setName("Kolyan");
        ad2.setEmail("Kolyan@mail.com");
        ad2.setDate("20/50/2007");
        ad2.setPhone("234234234");
        ad2.setContent("сдаю без комиссии 1 комн квартиру 7 мин.пишком от метро Варшавская. " +
                "Вся мебель и бытовая новые стоимость 22500р в месяц +свет телефон и интернет." +
                "Посредникам строго не звонить.");
        list.add(ad1);
        list.add(ad2);
        final MainFrame mainFrame = new MainFrame();

        new Thread(mainFrame, "main_frame").start();
        Thread.sleep(200);
        for (int i = 0; i < 10; i++) {
            mainFrame.handleNewAds(list);
            Thread.sleep(5000);
        }
    }
}
